使用ssh反向隧道进行内网穿透

引言

既然我们已经有了一个云服务器,那么我们能否把它当成一个跳板,访问云服务器的某个端口时“反向代理”到另一个内网设备上部署的东西呢?

准备工作

一台本地电脑

一台云服务器

反向隧道

1
$ ssh -R 0.0.0.0:3000:localhost:3000 -R 0.0.0.0:11434:localhost:11434 -N root@xxxxx.xxx

相关参数

1
2
3
4
5
6
ssh -R [remote_port]:[bind_address]:[local_port] user@remotehost
remote_port:远程服务器上将要监听的端口号。
bind_address:本地机器上的IP地址,默认为localhost,表示只允许来自本地的连接。如果设置为0.0.0.0,则允许所有来源的连接。
local_port:本地机器上的端口号,数据包会被转发到这里。
-N 的作用:不执行远程命令
-f 表示后台运行

但是会发现外网访问不了,是因为绑定到了 127.0.0.1 上,只有本机可以访问,我们得把他绑定到 0.0.0.0:port 上,才能让外网访问。

打开云服务器上的 ~/.ssh/sshd_config或者/etc/ssh/sshd_config

1
2
#修改
GatewayPorts yes

然后重启 ssh

1
sudo systemctl restart ssh

重新建立反向隧道即可

autossh 使用

autossh 是一个增强版的 SSH 工具,用于自动监控和重启 SSH 隧道。如果网络不稳定或连接断开,autossh 会尝试重新建立连接,非常适合需要持久隧道的场景,比如我的 Open WebUI 和 Ollama 服务。

使用

1
autossh -M 0 -f -N -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -R 0.0.0.0:3000:localhost:3000 -R 0.0.0.0:11434:localhost:11434 root@xxxxx.xxx

具体我另开一篇

ollama+open WebUI 部署时外网访问没有模型

这是因为在本地部署时,我们的 ollama 部署在 localhost:11434 端口,然后我们的 openWebUI 是从 11434 中读取模型。

但是我们的 ssh 反向映射到了 linux 上之后,openWebUI 在云服务器上面访问 localhost:11434,也就是访问我们本地的这个端口,在这个过程里出问题了。

我们使用lsof -i :11434 发现是localhost:11434或者127.0.0.1:11434也就是说云服务器访问本机的时候失败了。

我们查看ollama 文档可以看到设置服务器

1
launchctl setenv OLLAMA_HOST "0.0.0.0:11434"